/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package agenda;

import java.awt.Component;
import java.awt.event.MouseEvent;
import java.text.ParseException;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.text.DocumentFilter;

/**
 *
 * @author manu
 */
@SuppressWarnings("serial")
public class NumCellditor extends AbstractCellEditor implements TableCellEditor {

    JFormattedTextField jftf;

    public NumCellditor() {

        /* Crea una FormatterFactory che restituisce soltanto un semplice
         * formattatore (AbstractFormatter) che non fa altro che restituire
         * restituire le stesse stringhe che gli sono state passate in ingresso
         * ed applicare il DocumentFilter NumFilter ad ogni documento nel quale
         * viene installato il formattatore.
         */
        JFormattedTextField.AbstractFormatterFactory ff = new JFormattedTextField.AbstractFormatterFactory() {

            @Override
            public JFormattedTextField.AbstractFormatter getFormatter(JFormattedTextField tf) {
                return new JFormattedTextField.AbstractFormatter() {

                    @Override
                    public DocumentFilter getDocumentFilter() {
                        return new NumFilter();
                    }

                    @Override
                    public Object stringToValue(String text) throws ParseException {
                        return text;
                    }

                    @Override
                    public String valueToString(Object value) throws ParseException {
                       if (value == null)
                           return "";
                        return value.toString();
                    }
                };
            }
        };

        /* inizializza il FormattedTextField e imposta la FormatterFactory */
        jftf = new JFormattedTextField(ff);
    }

   @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        /* imposta il testo nel FextField */
        jftf.setValue(value);
        /* Imposta la posizione del cursore alla fine del testo */
        jftf.setCaretPosition(jftf.getText().length());
        return jftf;
    }

   @Override
    public Object getCellEditorValue() {
        return jftf.getValue();
    }

    @Override
    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent)
            return ((MouseEvent)anEvent).getClickCount() >= 2;
        return false;
    }

    @Override
    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    @Override
    public boolean stopCellEditing() {
        /* FIXME in teoria commitEdit dovrebbe essere invocato quando il
         * FormattedTextField perde il focus (ad esempio cliccando in un altro
         * oggetto) ma a quanto pare questo non avviene, o avviene troppo
         * tardi, e quindi il valore der FtF non viene settato a meno che non
         * si prema invio (l'altro caso in cui commitEdit viene invocato).
         *
         * Per ora risolvo il problema semplicemente invocando in questo metodo
         * che viene chiamato da qualche parte nella jTable quando si passa ad
         * un altra cella della tabella... poi magari cercherò di capirci
         * qualcosa d+... o lo farai tu.
         */
        try {
            jftf.commitEdit();
        } catch (ParseException ex) {
            /* gnignigni */
        }
        fireEditingStopped();
        return true;
    }

    @Override
    public void cancelCellEditing() {
        fireEditingCanceled();
    }

    @Override
    public void addCellEditorListener(CellEditorListener l) {
        super.addCellEditorListener(l);
    }

    @Override
    public void removeCellEditorListener(CellEditorListener l) {
        super.removeCellEditorListener(l);
    }
}
